/**
 * 硬币找零问题，（动态规划算法，自底向上求解）
 * 对空间使用进行了优化，通过对一维数组的迭代，代替了二维数组，缺点是只保留了最新值，没有保存中间结果
 */

#include <bits/stdc++.h>
int const MAXCOUNT = 9999;

int change(int *coinValues, int coinKinds, int n) {
  // 申请二维数组 c[coinKinds+1][n+1]
  int *c = (int *)malloc(sizeof(int) * (n + 1));
  // 0. 初始化，c[i,j]表示使用i种硬币找零金额j需要的硬币数量
  // 0.1 先对硬币进行排序，coinValues[] 下标从1开始
  std::sort(coinValues + 1, coinValues + 1 + coinKinds);
  // 0.2 找零0元需要0枚硬币
  c[0] = 0;
  // 0.3 默认找零任意金额需要无限枚硬币
  for (int i = 1; i <= n; i++) {
    c[i] = MAXCOUNT;
  }
  for (int j = 1; j <= n; j++) {
    for (int i = 1; i <= coinKinds; i++) {
      // 状态转移
      if ((coinValues[i] <= j) && (c[j] > c[j - coinValues[i]] + 1)) {
        c[j] = c[j - coinValues[i]] + 1;
      }
    }
  }
  return c[n];
}

int main() {
  int m, n;
  while (scanf("%d", &m) == 1 && m > 0) {
    int *coinValues = (int *)malloc(sizeof(int) * m + 1);
    for (int i = 1; i <= m; i++) {
      scanf("%d", &coinValues[i]);
    }
    scanf("%d", &n);
    int count;
    count = change(coinValues, m, n);
    if (count != MAXCOUNT) {
      printf("%d\n", count);
    } else {
      printf("Impossible\n");
    }
  }
  return 0;
}